vk_api.exceptions.AuthError: Unknown error (AUTH; no sid)#522
vk_api.exceptions.AuthError: Unknown error (AUTH; no sid)#522python273 merged 5 commits intopython273:masterfrom
Conversation
|
Исправил ошибку с капчей, которую пропустил - не вылезала никогда в этом месте капча =) Добавил метод |
| The implementation is taken from the VK source code. | ||
| """ | ||
| charset = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' | ||
| return ''.join(random.choice(charset) for _ in range(n)) |
There was a problem hiding this comment.
random не безопасный, лучше из secrets взять.
The implementation is taken from the VK source code.
Это можно убрать, это из nanoid. Строку лучше просто отсортированную вставить
|
|
||
| credentials.sid = account['sid'] | ||
|
|
||
| verification_method = account['next_step']['verification_method'] |
There was a problem hiding this comment.
Да у них так всегда теперь =) Хм, это значит он звонок на телефон сделал, попробую сэмулировать такое поведение
There was a problem hiding this comment.
Нужно больше информации =)
- В аккаунте включена двухфакторная аутентификация?
- Какие способы посылки кода предлагает ВК?
- Когда не пришел next_step, ВК сам прислал какой-то код или звонок?
There was a problem hiding this comment.
- Только номер + пароль
- Ничего не предлагает, сейчас только пароль спросил и сразу зашло в браузере
- Коды не присылаются после фейла
скинь как твой респонз выглядит. Есть enable_debug_mode(vk_session, print_content=True) чтобы запросы в консоль печатать
There was a problem hiding this comment.
Если закомментить от verification_method = account['next_step']['verification_method'] и if ниже, то проходит логин
но не знаю как звонок проходить, на нем наверное ломаться будет
There was a problem hiding this comment.
скинь как твой респонз выглядит
{"response":{"is_phone":true,"flow_name":"need_password","flow_names":["password","otp"],"sid":"loginvalidate_********","next_step":{"verification_method":"sms","has_another_verification_methods":true},"remember_hash":"*******"}}
Свежий аккаунт, в нем одноразовые пароли через смс (иногда звонок делает). Хитрым образом я таки задал пароль. 2fa отключен
Меня смущает, что в моих аккаунтах где включен 2fa - flow_name равен need_password_and_validation, почему я и спросил, включено оно или нет
Один раз я падал с ошибкой, что ключа нет, но решил, что это случайная бага из-за битого конфига или типо того, потому что ни разу на всех 4-х аккаунтах оно не вылезало
There was a problem hiding this comment.
то проходит логин
потому что есть пароль и 2fa отключено, видимо оставлено для старых аккаунтов, но при этом в браузере просит код
There was a problem hiding this comment.
Итог, для двух аккаунтов с телефоном, паролем и отключенным 2fa - стабильно приходит ответ без next_step. Я думаю в этой ситуации можно смело логиниться с паролем, т.к. похоже в случае одноразовых паролей next_step приходит стабильно
Еще один интересный момент, при каких-то условиях на шаге ввода пароля под кнопкой продолжить появилась ссылка на другие варианты. И я получил еще один метод апи, который сам определяет вариант подтверждения и высылает смс или звонок
|
@python273 пока я анализировал ответы от разных аккаунтов и придумывал, как лишний раз не вводить код подтверждения, ВК опять что-то изменил и убрал окончательно пароли без 2fa =) Так что пошел по пути наименьшего сопротивления =) |
| class ParseError(AuthError): | ||
| """Любая ошибка при парсинге исходных кодов сайта.""" | ||
|
|
||
|
|
||
| class AuthorizeError(AuthError): | ||
| """ | ||
| Любая ошибка, которая может возникнуть в момент авторизации | ||
| существующего пользователя с проверенным кодом подтверждения или паролем. | ||
| (https://login.vk.com/?act=connect_authorize) | ||
| """ | ||
| def __init__(self, error: t.Dict[str, t.Any]) -> None: | ||
| self.error = error | ||
|
|
||
| def __str__(self) -> str: | ||
| return '[{error_code}] {error_info}'.format(**self.error) |
There was a problem hiding this comment.
не думаю нужно отдельные ошибки, можно просто AuthError. Смысл отдельные добавлять только если их обрабатывать как-то можно
There was a problem hiding this comment.
AuthError базовый тип, к нему по логике не возможно добавить какую-то дополнительную информацию об ошибке. Вызовы к login возвращают стандартизированный ответ, в котором есть error_code и другая информация об ошибке. Я думаю могут быть ситуации, когда пользователю библиотеки эта информация пригодится =)
ParseError возможно действительно лишний. В любом случае позже я хочу добавить вход по qr-коду и посмотрю свежим взглядом, пусть пока "полежит" =)
There was a problem hiding this comment.
Такое можно просто в текст ошибки, обрабатывать это все равно норм не получится. Можно конечно в AuthError добавить поле для какой-то общей error_metadata и туда сувать всякое, но тоже не уверен есть ли смысл
|
|
||
| return response if raw else response['response'] | ||
|
|
||
| def vk_login_method( |
There was a problem hiding this comment.
Не соглашусь, этот метод может быть частью интерфейса библиотеки, т.к. у login (как и у api) есть разные полезные методы. Например, я использую эту точку для получения веб токена, который нужен для прямых ссылок на видео
There was a problem hiding this comment.
хмм, слишком internal выглядит для добавления в интерфейс (с data и headers), я бы себе такое в код копировал, а не из библиотеки вызывал
There was a problem hiding this comment.
да не очень =) data - это как values у method, можно переименовать для согласованности, хоть меня оно и смущает и привычнее data из requests =)
для заголовков нужно больше действий подергать и посмотреть, нужны ли разные данные или можно жестко зашить origin и content-type, второй в принципе и не нужен, оно и так должно отправить как форму
пишут не всегда пароль выбирает для логина, хотя он доступен в опциях на сайте |
|
@python273 это происходит потому что ВК теперь форсирует отправку кода, даже если можно войти по паролю. Ответ ВК никак не стандартизирован и по нему не возможно понять, когда включена 2fa, а когда беспарольный вход - получается гадание на кофейной гуще Единственный 100% способ, это сделать еще один запрос к api для получения списка доступных методов и если среди них есть пароль, можно пробовать входить, но для включенной 2fa или беспарольного входа - получается узкий случай Добавить можно, если критично, только я свой подходящий аккаунт запорол и проверить не смогу =( Нужен такой, где отключен 2fa, но остался пароль и где метод |
kyzima-spb
left a comment
There was a problem hiding this comment.
Убрал исключения, сделал принудительную проверку способов подтверждения входа на наличие пароля - лишний запрос, но ответы ВК не стандартизированы, по другому не получится
В целом ситуация стала лучше, установил вашу репу, авторизации пошли нормально, и почти нет той проблемы которая описовалась выше |
почему почти? |
на некоторых продолжает вылазить INFO:vk_api:Confirmation code sent via push to the iPhone 14 Pro, status 0. |
|
Я думаю это защита ВК, он в принципе жонглирует разными способами подтверждения: то смс, то звонок, то капчи сыплет одну за одной, а то и по несколько подряд, один раз меня просто забанил на сутки =) На одном аккаунте, где нет next_step и железобетонно должен просить пароль, в какой-то момент он отправил смс-ку, хорошо я сохранил эти запросы на всякий случай, т.к. если нет next_step, то не возможно узнать способы подтверждения и отправить код =) Разницы между телефоном или почтой я не заметил - поведение одинаковое. Ответы не стандартизированы, т.е. я не могу 100% понять включена ли 2fa по ним, как и включены ли otp
но пароль есть? 100% защита со стороны ВК
на текст ошибки можно внимания не обращать, auth_handler сейчас просит код для 2fa и для otp. Я не стал трогать этот код, потому что вдруг еще где-то старая форма входа вылезет и чтобы не ломать чужой код. В будущем (полгодика думаю норм подождать), если автор не против, я бы сделал рефакторинг и убрал весь legacy код с сохранением совместимости с чужим кодом =) |
Пароль есть 100%, понял |
Попробуйте включить вывод запросов и посмотреть, что он вернет при вызове Будет здорово, если возьмете исходник, закомментируйте мою строчку и проверите этот случай, строчка не будет отправлять код подтверждения и вы перейдете сразу к вводу пароля, что ВК скажет на такой финт? =) |
|
ERROR - Неожиданная ошибка: HTTPSConnectionPool(host='login.vk.com', port=443): Max retries exceeded with url: /?act=connect_internal (Caused by ProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 503 Service Unavailable'))) Хотя прокси рабочие, и очень часто такая ошибка стала появлятся |
Аргумент Имхо, беглым взглядом посмотрел код, где вызывается этот метод и, если верно понял, то он вызывается только в случаях, если токен стал не валидным или если куки проверяются на актуальность. Они не должны на столько быстро "протухать", чтобы так часто вызывался этот метод |
я по логину паролю вхожу |
|
ERROR - Ошибка авторизации: Failed to get the value of variable window.init. теперь вот такая ошибка |
Это означает, что страница с данными для логина не была загружена корректно. Я проверил у себя аккаунт с логином и паролем, ошибок нет Без логов здесь вряд ли кто-то вам сможет помочь |
Извиняюсь ложная тревога, вчера вечером вк лежал |
|
Здравствуйте заметил проблему, если в логине номер и пароль верный то входит, а если в логине email - то говорит неверный пароль, хотя через браузер по этому же емейлу входит без проблем |

Новая "форма" входа, с сохранением старой формы
Что было добавлено:
credentialsс классомWebLoginCredentials- все данные, нужные для процесса входа с "новой" формой. Не захотелось хардкодить, поэтому вынес в отдельный классVerificationMethodв модулеenums- все известные на текущий момент имена способов подтверждения входа в аккаунтvk_api.VkApi.method:with_cookies, он позволяет не затирать текущие сессионные куки и вызывать "внутренние" методы API, которым для аутентификации пользователя вместо токена доступа нужны куки. По-умолчанию имеет значениеFalse, поэтому поведение библиотеки не изменилосьvaluesбыл явно передан токен доступа (ключaccess_token) - использовать его, иначе поведение библиотеки по умолчанию. Во-первых, была ошибка, если токен ранее сохранен в конфиге, но аутентификация проходит повторно - некоторые "внутренние" методы API падали с ошибкой о не возможности одновременно использовать и куки, и токен. Во-вторых, это может быть полезно для вызова "внутренних" методов, напримерvideo.getVideoDiscover, с токеном, отличным от получаемого библиотекой. В-третьих, "внутренние" методы тоже могут просить капчу и DRY =)generate_device_idв модулеutils- исходник взят из JS файла ВК, хотя можно генерировать и случайное значение, думаю лучше брать оригинал, чтобы меньше "палиться"С
remember_deviceя так и не смог разобраться, мне кажется эту функцию убрали. Если кому-то это критично, то думаю смогут допилить самостоятельно и кинуть PR